home *** CD-ROM | disk | FTP | other *** search
/ Visual Cafe 3 / Visual Cafe 3.ISO / Vcafe / JFC.bin / DefaultHighlighter.java < prev    next >
Text File  |  1998-06-30  |  8KB  |  278 lines

  1. /*
  2.  * @(#)DefaultHighlighter.java    1.22 98/04/09
  3.  * 
  4.  * Copyright (c) 1997 Sun Microsystems, Inc. All Rights Reserved.
  5.  * 
  6.  * This software is the confidential and proprietary information of Sun
  7.  * Microsystems, Inc. ("Confidential Information").  You shall not
  8.  * disclose such Confidential Information and shall use it only in
  9.  * accordance with the terms of the license agreement you entered into
  10.  * with Sun.
  11.  * 
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  13.  * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  14.  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  15.  * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
  16.  * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
  17.  * THIS SOFTWARE OR ITS DERIVATIVES.
  18.  * 
  19.  */
  20. package com.sun.java.swing.text;
  21.  
  22. import java.util.Vector;
  23. import java.awt.*;
  24. import com.sun.java.swing.plaf.*;
  25.  
  26. /**
  27.  * Implements the Highlighter interfaces.  Implements a simple highlight
  28.  * painter that renders in a solid color.
  29.  * 
  30.  * @author  Timothy Prinzing
  31.  * @version 1.22 04/09/98
  32.  * @see     Highlighter
  33.  */
  34. public class DefaultHighlighter implements Highlighter {
  35.  
  36.     /**
  37.      * Creates a new DefaultHighlighther object.
  38.      */
  39.     public DefaultHighlighter() {
  40.     }
  41.  
  42.     // ---- Highlighter methods ----------------------------------------------
  43.  
  44.     /**
  45.      * Renders the highlights.
  46.      *
  47.      * @param g the graphics context
  48.      */
  49.     public void paint(Graphics g) {
  50.         // PENDING(prinz) - should cull ranges not visible
  51.         Rectangle a = new Rectangle(component.getSize());
  52.         Insets insets = component.getInsets();
  53.         a.x += insets.left;
  54.         a.y += insets.top;
  55.         a.width -= insets.left + insets.right;
  56.         a.height -= insets.top + insets.bottom;
  57.         int len = highlights.size();
  58.         for (int i = 0; i < len; i++) {
  59.         HighlightInfo info = (HighlightInfo) highlights.elementAt(i);
  60.         Highlighter.HighlightPainter p = info.getPainter();
  61.         p.paint(g, info.getStartOffset(), info.getEndOffset(), a, component);
  62.         }
  63.     }
  64.  
  65.     /**
  66.      * Called when the UI is being installed into the
  67.      * interface of a JTextComponent.  Installs the editor, and
  68.      * removes any existing highlights.
  69.      *
  70.      * @param c the editor component
  71.      * @see Highlighter#install
  72.      */
  73.     public void install(JTextComponent c) {
  74.     component = c;
  75.     removeAllHighlights();
  76.     }
  77.  
  78.     /**
  79.      * Called when the UI is being removed from the interface of
  80.      * a JTextComponent.
  81.      *
  82.      * @param c the component
  83.      * @see Highlighter#deinstall
  84.      */
  85.     public void deinstall(JTextComponent c) {
  86.     component = null;
  87.     }
  88.  
  89.     /**
  90.      * Adds a highlight to the view.  Returns a tag that can be used 
  91.      * to refer to the highlight.
  92.      *
  93.      * @param p0   the start offset of the range to highlight >= 0
  94.      * @param p1   the end offset of the range to highlight >= p0
  95.      * @param p    the painter to use to actually render the highlight
  96.      * @returns    an object that can be used as a tag
  97.      *   to refer to the highlight
  98.      * @exception BadLocationException if the specified location is invalid
  99.      */
  100.     public Object addHighlight(int p0, int p1, Highlighter.HighlightPainter p) throws BadLocationException {
  101.     Document doc = component.getDocument();
  102.     TextUI mapper = component.getUI();
  103.         HighlightInfo i = new HighlightInfo();
  104.         i.painter = p;
  105.     i.p0 = doc.createPosition(p0);
  106.     i.p1 = doc.createPosition(p1);
  107.         highlights.addElement(i);
  108.     mapper.damageRange(p0, p1);
  109.         return i;
  110.     }
  111.  
  112.     /**
  113.      * Removes a highlight from the view.
  114.      *
  115.      * @param tag the reference to the highlight
  116.      */
  117.     public void removeHighlight(Object tag) {
  118.     TextUI mapper = component.getUI();
  119.     HighlightInfo info = (HighlightInfo) tag;
  120.     mapper.damageRange(info.p0.getOffset(), info.p1.getOffset());
  121.     highlights.removeElement(tag);
  122.     }
  123.  
  124.     /**
  125.      * Removes all highlights.
  126.      */
  127.     public void removeAllHighlights() {
  128.     TextUI mapper = component.getUI();
  129.     if (mapper != null) {
  130.         int len = highlights.size();
  131.         if (len != 0) {
  132.         int p0 = Integer.MAX_VALUE;
  133.         int p1 = 0;
  134.         for (int i = 0; i < len; i++) {
  135.             HighlightInfo info = (HighlightInfo) highlights.elementAt(i);
  136.             p0 = Math.min(p0, info.p0.getOffset());
  137.             p1 = Math.max(p1, info.p1.getOffset());
  138.         }
  139.         mapper.damageRange(p0, p1);
  140.         highlights.removeAllElements();
  141.         }
  142.     }
  143.     }
  144.  
  145.     /**
  146.      * Changes a highlight.
  147.      *
  148.      * @param tag the highlight tag
  149.      * @param p0 the beginning of the range >= 0
  150.      * @param p1 the end of the range >= p0
  151.      * @exception BadLocationException if the specified location is invalid
  152.      */
  153.     public void changeHighlight(Object tag, int p0, int p1) throws BadLocationException {
  154.     TextUI mapper = component.getUI();
  155.     Document doc = component.getDocument();
  156.     HighlightInfo info = (HighlightInfo) tag;
  157.     int oldP0 = info.p0.getOffset();
  158.     int oldP1 = info.p1.getOffset();
  159.     if (p0 == oldP0) {
  160.         mapper.damageRange(Math.min(oldP1, p1), Math.max(oldP1, p1));
  161.     } else if (p1 == oldP1) {
  162.         mapper.damageRange(Math.min(p0, oldP0), Math.max(p0, oldP0));
  163.     } else {
  164.         mapper.damageRange(oldP0, oldP1);
  165.         mapper.damageRange(p0, p1);
  166.     }
  167.     info.p0 = doc.createPosition(p0);
  168.     info.p1 = doc.createPosition(p1);
  169.     }
  170.  
  171.     /**
  172.      * Makes a copy of the highlights.  Does not actually clone each highlight,
  173.      * but only makes references to them.
  174.      *
  175.      * @return the copy
  176.      * @see Highlighter#getHighlights
  177.      */
  178.     public Highlighter.Highlight[] getHighlights() {
  179.     Highlighter.Highlight[] h = new Highlighter.Highlight[highlights.size()];
  180.     highlights.copyInto(h);
  181.     return h;
  182.     }
  183.  
  184.     // ---- member variables --------------------------------------------
  185.     
  186.     private Vector highlights = new Vector();  // Vector<HighlightInfo>
  187.     private JTextComponent component;
  188.  
  189.  
  190.     /**
  191.      * Simple highlight painter that fills a highlighted area with
  192.      * a solid color.
  193.      */
  194.     public static class DefaultHighlightPainter implements Highlighter.HighlightPainter {
  195.  
  196.         /**
  197.          * Constructs a new highlight painter.
  198.          *
  199.          * @param c the color for the highlight
  200.          */
  201.         public DefaultHighlightPainter(Color c) {
  202.         color = c;
  203.     }
  204.     
  205.         /**
  206.          * Returns the color of the highlight.
  207.          *
  208.          * @return the color
  209.          */
  210.     public Color getColor() {
  211.         return color;
  212.     }
  213.  
  214.     // --- HighlightPainter methods ---------------------------------------
  215.  
  216.         /**
  217.          * Paints a highlight.
  218.          *
  219.          * @param g the graphics context
  220.          * @param offs0 the starting model offset >= 0
  221.          * @param offs1 the ending model offset >= offs1
  222.          * @param bounds the bounding box for the highlight
  223.          * @param c the editor
  224.          */
  225.         public void paint(Graphics g, int offs0, int offs1, Shape bounds, JTextComponent c) {
  226.         Rectangle alloc = bounds.getBounds();
  227.         try {
  228.         // --- determine locations ---
  229.         TextUI mapper = c.getUI();
  230.         Rectangle p0 = mapper.modelToView(offs0);
  231.         Rectangle p1 = mapper.modelToView(offs1);
  232.  
  233.         // --- render ---
  234.         g.setColor(getColor());
  235.         if (p0.y == p1.y) {
  236.             // same line, render a rectangle
  237.             Rectangle r = p0.union(p1);
  238.             g.fillRect(r.x, r.y, r.width, r.height);
  239.         } else {
  240.             // different lines
  241.             int p0ToMarginWidth = alloc.x + alloc.width - p0.x;
  242.             g.fillRect(p0.x, p0.y, p0ToMarginWidth, p0.height);
  243.             if ((p0.y + p0.height) != p1.y) {
  244.             g.fillRect(alloc.x, p0.y + p0.height, alloc.width, 
  245.                    p1.y - (p0.y + p0.height));
  246.             }
  247.             g.fillRect(alloc.x, p1.y, (p1.x - alloc.x), p1.height);
  248.         }
  249.         } catch (BadLocationException e) {
  250.         // can't render
  251.         }
  252.     }
  253.  
  254.     private Color color;
  255.  
  256.     }
  257.  
  258.     class HighlightInfo implements Highlighter.Highlight {
  259.  
  260.     public int getStartOffset() {
  261.         return p0.getOffset();
  262.     }
  263.  
  264.     public int getEndOffset() {
  265.         return p1.getOffset();
  266.     }
  267.  
  268.     public Highlighter.HighlightPainter getPainter() {
  269.         return painter;
  270.     }
  271.  
  272.     Position p0;
  273.     Position p1;
  274.         Highlighter.HighlightPainter painter;
  275.     }
  276.  
  277. }
  278.